package com.czxy.changgou3.service;

import com.alibaba.fastjson.JSON;
import com.czxy.changgou3.cart.Cart;
import com.czxy.changgou3.cart.CartItem;
import com.czxy.changgou3.feign.SkuFeign;
import com.czxy.changgou3.pojo.User;
import com.czxy.changgou3.vo.CartVo;
import com.czxy.changgou3.vo.OneSkuResult;
import com.czxy.vo.BaseResult;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author zhangmengxiang1@itcast.cn
 * @version 1.0
 * @date 2020/5/3
 */
@Service
@Transactional
public class CartService {
    @Resource
    private SkuFeign skuFeign;

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    public void addCart(User loginUser, CartVo cartVo){
        //1 查询sku详情
        BaseResult<OneSkuResult> baseResult = skuFeign.findById(cartVo.getSkuid());
        OneSkuResult oneSkuResult = baseResult.getData();

        //2 封装CartItem
        CartItem cartItem = new CartItem();
        cartItem.setSkuid( oneSkuResult.getSkuid() );
        cartItem.setSpuid( oneSkuResult.getSpuid() );
        cartItem.setGoodsName( oneSkuResult.getGoodsName() );
        cartItem.setPrice( oneSkuResult.getPrice() );
        cartItem.setCount( cartVo.getCount() );
        cartItem.setChecked( cartVo.getChecked() );
        cartItem.setMidlogo( oneSkuResult.getLogo().get("biglogo") );
//        cartItem.getSpecInfoIdTxt( JSON.toJSONString(oneSkuResult.getSpecInfo()) );
        cartItem.setSpecInfoIdTxt( JSON.parseObject(oneSkuResult.getSpecInfo().get("id_txt"), Map.class) );
        //3 从redis获得购物车，如果不存在需要创建一个新的,如果存在 （字符串-->java对象）
        String cartJSON = stringRedisTemplate.opsForValue().get("cart" + loginUser.getId());
        Cart cart = null;
        if(cartJSON != null){
            //将字符串转换成java对象
            cart = JSON.parseObject(cartJSON, Cart.class);
        } else {
            //创建新
            cart = new Cart();
        }

        //4 将封装数据添加到购物车
        cart.addToCart( cartItem );

        //5 将购物车保存redis中
        cartJSON = JSON.toJSONString(cart);
        stringRedisTemplate.opsForValue().set("cart" + loginUser.getId() , cartJSON);

    }

    /**
     * 查询当前用户的购物车
     */
    public Cart queryCartList(User user){
        //查询当前用户的购物车
        String jsonStr = stringRedisTemplate.opsForValue().get("cart" + user.getId());
        //返回
        Cart cart = JSON.parseObject(jsonStr, Cart.class);
        if(cart == null){
            return new Cart();
        }
        return cart;
    }

    /**
     * 更新指定用户的购物车数据
     * @param user
     */
    public void updateCart(User user, List<CartVo> cartVoList){
        //1 从redis获得购物车
        String cartStr = stringRedisTemplate.opsForValue().get("cart" + user.getId());
        if(cartStr == null) {
            throw new RuntimeException("购物车不存在");
        }
        Cart cart = JSON.parseObject(cartStr, Cart.class);
        //2 处理请求数据，方便进行遍历，此处采用mapper进行处理
        Map<Integer,CartVo> map = new HashMap<>();
        for (CartVo cartVo : cartVoList) {
            map.put(cartVo.getSkuid(), cartVo);
        }

        //3 请求数据和redis中存放进行对比
        for (CartItem cartItem : cart.getData().values()) {
            //4 匹配成功：更新数据；不成功：删除数据
            CartVo cartVo = map.get(cartItem.getSkuid());
            if( cartVo != null ) {
                //更新操作
                cart.updateCart(cartVo.getSkuid(),cartVo.getCount(),cartVo.getChecked());
            } else {
                //删除
                cart.removeCart(cartItem.getSkuid());
            }

        }
        //5 更新购物车
        stringRedisTemplate.opsForValue().set("cart" + user.getId(), JSON.toJSONString(cart));
    }

}
